package com.gsj.web.aspect;

import com.gsj.domain.system.SysLog;
import com.gsj.domain.user.User;
import com.gsj.service.system.SysLogService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

@Component
@Aspect
public class LogAspect {

    @Autowired(required = false)
    private SysLogService sysLogService;
    @Autowired
    private HttpServletRequest request;

    /**
     * 执行控制器方法之后自动记录日志
     * 环绕通知：
     *    bean(*Controller)   拦截容器中所有以Controller结尾的类
     *    !bean(sysLogController) 不拦截容器中指定的控制器（访问日志列表不需要记录日志到数据库）
     */
    @Around("bean(*Controller) && !bean(sysLogController)")
    public Object insertLog(ProceedingJoinPoint pjp){
        try {
            // 放行，执行控制器的方法
            Object retV = pjp.proceed();


            // 创建日志对象
            SysLog log = new SysLog();
            // 获取当前登陆用户
            User user = (User) request.getSession().getAttribute("loginUser");
            if (user != null) {
                log.setUserName(user.getUserName());
                log.setCompanyId(user.getCompanyId());
                log.setCompanyName(user.getCompanyName());
            }
            // 设置访问者的ip地址
            log.setIp(request.getRemoteAddr());
            // 设置访问时间
            log.setTime(new Date());
            // 设置当前执行的控制器类全名
            log.setAction(pjp.getTarget().getClass().getName());
            // 设置当前执行的方法
            log.setMethod(pjp.getSignature().getName());

            // 保存日志
            sysLogService.save(log);
            return retV;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            throw new RuntimeException(throwable);
        }
    }
}